#include <bits/stdc++.h>

#define lbt(x) (x&(-x))

using namespace std;

typedef long long LL;

const LL N=3e5+5,MAX=1e9,M=5e4+5;

LL n,q,ss,a[N];
map<LL,LL> mp;

struct BIT {
	LL tot;
	map<LL,LL> pp;
	vector<LL> v;
	void Upd(LL x,LL y) {
		for (LL i=x;i<=n;i+=lbt(i)) {
			if (!pp[i]) {
				pp[i]=++tot;
				v.push_back(y);
			}
			else v[pp[i]-1]+=y;
		}
	}
	
	LL Qry(LL x) {
		LL Sum=0;
		for (LL i=x;i;i-=lbt(i)) {
			if (pp[i]) Sum+=v[pp[i]-1];
		}
		return Sum;
	}
}s[M];

struct Seg {
	LL tot,rt,v[N*75],ls[N*75],rs[N*75];
	
	void Up(LL x) {
		v[x]=v[ls[x]]+v[rs[x]];
	}
	
	void Upd(LL &x,LL l,LL r,LL pos,LL k,LL id) {
		if (!x) x=++tot;
		if (l==r) {
			v[x]+=k;
			if (!mp[l]) {
				ss++;
				s[ss].Upd(id,1);
				mp[l]=ss;
			}
			else s[mp[l]].Upd(id,k);
			return;
		}
		LL mid=(l+r)>>1;
		if (pos<=mid) Upd(ls[x],l,mid,pos,k,id);
		else Upd(rs[x],mid+1,r,pos,k,id);
		Up(x);
	}
	
	LL Rank(LL x,LL l,LL r,LL k,LL id) {
		if (l==r) return s[mp[l]].Qry(id);
		
		LL mid=(l+r)>>1;
		
		if (k<=mid) return Rank(ls[x],l,mid,k,id);
		else return Rank(rs[x],mid+1,r,k,id)+v[ls[x]];
	}
}T;

int main() {
	freopen("sort.in","r",stdin);
	freopen("sort.out","w",stdout);
	
	scanf("%lld%lld",&n,&q);
	for (LL i=1;i<=n;i++) {
		scanf("%lld",&a[i]);
		T.Upd(T.rt,1,MAX,a[i],1,i);
	}
	
	while (q--) {
		LL op,x,v;
		scanf("%lld",&op);
		
		if (op==1) {
			scanf("%lld%lld",&x,&v);
			T.Upd(T.rt,1,MAX,a[x],-1,x);
			T.Upd(T.rt,1,MAX,v,1,x);
			a[x]=v;
		}
		else {
			scanf("%lld",&x);
			printf("%lld\n",T.Rank(T.rt,1,MAX,a[x],x));
		}
	}
	
	return 0;
}
